package org.finesys.codegen.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.finesys.codegen.conveter.GenGroupConvert;
import org.finesys.codegen.dto.GenTemplateGroupDTO;
import org.finesys.codegen.entity.GenGroup;
import org.finesys.codegen.entity.GenTemplateGroup;
import org.finesys.codegen.mapper.GenGroupMapper;
import org.finesys.codegen.service.GenGroupService;
import org.finesys.codegen.service.GenTemplateGroupService;
import org.finesys.common.mp.core.service.impl.BaseServiceImpl;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class GenGroupServiceImpl extends BaseServiceImpl<GenGroupMapper, GenGroup> implements GenGroupService {

    private final GenTemplateGroupService genTemplateGroupService;

    @Override
    public boolean saveGroup(GenTemplateGroupDTO genTemplateGroupDTO) {
        GenGroup genGroup = GenGroupConvert.INSTANCE.convert(genTemplateGroupDTO);
        this.save(genGroup);

        if (genTemplateGroupDTO.getTemplateIds() != null) {
            List<GenTemplateGroup> genTemplateGroupList = new ArrayList<>();
            genTemplateGroupDTO.getTemplateIds().forEach(templateId -> {
                GenTemplateGroup genTemplateGroup = new GenTemplateGroup();
                genTemplateGroup.setGroupId(genGroup.getGroupId());
                genTemplateGroup.setTemplateId(templateId);
                genTemplateGroupList.add(genTemplateGroup);

            });
            genTemplateGroupService.saveBatch(genTemplateGroupList);
        }
        return Boolean.TRUE;
    }


    @Override
    public boolean updateGroup(GenTemplateGroupDTO genTemplateGroupDTO) {
        GenGroup genGroup = GenGroupConvert.INSTANCE.convert(genTemplateGroupDTO);
        this.updateById(genGroup);
        //更新模版信息
        genTemplateGroupService.remove(Wrappers.<GenTemplateGroup>lambdaUpdate().eq(GenTemplateGroup::getGroupId, genGroup.getGroupId()));
        //
        if (genTemplateGroupDTO.getTemplateIds() != null) {
            List<GenTemplateGroup> genTemplateGroupList = new ArrayList<>();
            genTemplateGroupDTO.getTemplateIds().forEach(templateId -> {
                GenTemplateGroup genTemplateGroup = new GenTemplateGroup();
                genTemplateGroup.setGroupId(genGroup.getGroupId());
                genTemplateGroup.setTemplateId(templateId);
                genTemplateGroupList.add(genTemplateGroup);

            });
            genTemplateGroupService.saveBatch(genTemplateGroupList);
        }
        return Boolean.TRUE;
    }

    @Override
    public boolean deleteGroup(Long[] ids) {
        this.removeBatchByIds(Arrays.asList(ids));
        genTemplateGroupService.remove(Wrappers.<GenTemplateGroup>lambdaUpdate().in(GenTemplateGroup::getGroupId, Arrays.asList(ids)));
        return Boolean.TRUE;
    }

    @Override
    public Set<GenGroup> findByTableId(Long tableId) {
        return this.baseMapper.findByTableId(tableId);
    }

    @Override
    public GenTemplateGroupDTO getGenTemplateGroupDTO(Long groupId) {
        GenGroup genGroup = this.getById(groupId);
        //转换为分组模板信息
        GenTemplateGroupDTO genTemplateGroupDTO = GenGroupConvert.INSTANCE.convert(genGroup);
        //查询模板信息
        List<GenTemplateGroup> templateGroups = genTemplateGroupService.list(Wrappers.<GenTemplateGroup>lambdaQuery().eq(GenTemplateGroup::getGroupId, groupId));
        if (templateGroups != null) {
            List<Long> templateList = templateGroups.stream().map(s -> s.getTemplateId()).collect(Collectors.toList());
            genTemplateGroupDTO.setTemplateIds(templateList);
        }
        return genTemplateGroupDTO;
    }


    @Override
    public GenTemplateGroupDTO getDetail(GenGroup query) {
        GenGroup genGroup = this.getOne(Wrappers.query(query));
        assert genGroup != null;
        //转换为分组模板信息
        GenTemplateGroupDTO genTemplateGroupDTO = GenGroupConvert.INSTANCE.convert(genGroup);
        //查询模板信息
        List<GenTemplateGroup> templateGroups = genTemplateGroupService.list(Wrappers.<GenTemplateGroup>lambdaQuery().eq(GenTemplateGroup::getGroupId, genGroup.getGroupId()));
        if (templateGroups != null) {
            List<Long> templateList = templateGroups.stream().map(s -> s.getTemplateId()).collect(Collectors.toList());
            genTemplateGroupDTO.setTemplateIds(templateList);
        }
        return genTemplateGroupDTO;
    }
}
